#include <iostream>

using namespace std;

class CStack
{
private:
    int *a;
    int size;
    int top;

public:
    CStack()
    {
        a = new int[10];
        size = 10;
        top = 0;
        cout << "Constructor." << endl;
    }
    CStack(int s)
    {
        a = new int[s];
        size = s;
        top = 0;
        cout << "Constructor." << endl;
    }
    int get(int index)
    {
        return *(a + index);
    }
    void push(int n)
    {
        a[top] = n;
        top++;
    }
    int isEmpty()
    {
        int i;
        if (top == 0)
            return 1;
        else
            return 0;
    }
    int isFull()
    {
        if (top == size)
            return 1;
        else
            return 0;
    }
    int pop()
    {
        top--;
        return *(a + top);
    }
    ~CStack()
    {
        delete[] a;
        cout << "Destructor." << endl;
    }
};

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        CStack s(n);
        int i;
        for (i = 0; i < n; i++)
        {
            int a;
            cin >> a;
            s.push(a);
        }
        for (i = 0; i < n - 1; i++)
        {
            cout << s.pop() << " ";
        }
        cout << s.pop() << endl;
    }
    return 0;
}

/*
【id:35】【20分】E. Stack(类与构造)
题目描述



上面是栈类的定义，栈是一种具有先进后出特点的线性表，请根据注释，完成类中所有方法的实现，并在主函数中测试之。

堆栈类的说明如下：

1. 堆栈的数据实际上是保存在数组a中，而a开始是一个指针，在初始化时，根据实际需求将a动态创建为数组，数组长度根据构造函数的参数决定。

2.size实际上就是数组的长度，当使用无参构造则size为10，当使用有参构造则size为s、

3.top表示数组下标，也表示数组中下一个存放数据的空白位置。

4.push操作表示堆栈的数组存放一个数据，例如一开始数组为空，则top为0，当有数据要入栈时，把数据存放在a[top]的位置，然后top加1指向下一个空白位置、数据进栈只能从栈顶进。

5.pop操作表示一个数据要出栈，数据出栈只能从栈顶出，先把top减1指向栈顶数据，然后把数据返回。

6.判断堆栈空的条件是top是否等于0，判断堆栈满的条件是top是否等于size


输入

测试数据的组数 t

第一个栈的大小

第一个栈的元素列表，将该列表的元素依次进栈

..........


输出

将栈元素依次出栈


样例查看模式
正常显示
查看格式
输入样例1 <-复制
2
5
1 2 3 4 5
7
-1 2 8 0 -3 1 3

输出样例1
Constructor.
5 4 3 2 1
Destructor.
Constructor.
3 1 -3 0 8 2 -1
Destructor.


*/